Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Exceptions
8 Die Funktionsbibliothek
9 Threads und nebenläufige Programmierung
10 Raum und Zeit
11 Datenstrukturen und Algorithmen
12 Dateien und Datenströme
13 Die eXtensible Markup Language (XML)
14 Grafische Oberflächen mit Swing
15 Grafikprogrammierung
16 Das Netz
17 JavaServer Pages und Servlets
18 Verteilte Programmierung mit RMI und Web–Services
19 Applets, Midlets und Sound
20 Datenbankmanagement mit JDBC
21 Reflection und Annotationen
22 Komponenten durch Bohnen
23 Logging und Monitoring
24 Sicherheitskonzepte
25 Java Native Interface (JNI)
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Index

Download:
- ZIP, ca. 12,5 MB
Buch bestellen

Website zum Buch
Weblog des Autors
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel

Java ist auch eine Insel
6., akt. und erw. Aufl., mit DVD
1.454 S., 49,90 Euro
Galileo Computing
ISBN 3-89842-838-9
gp 8 Die Funktionsbibliothek
  gp 8.1 Die Java-Klassenphilosophie
    gp 8.1.1 Übersicht über die Pakete der Standardbibliothek
  gp 8.2 Wrapper-Klassen
    gp 8.2.1 Die Basisklasse Number für numerische Wrapper-Objekte
    gp 8.2.2 Die Klasse Integer
    gp 8.2.3 Unterschiedliche Ausgabeformate
    gp 8.2.4 Autoboxing: Boxing und Unboxing
    gp 8.2.5 Die Boolean-Klasse
    gp 8.2.6 Die Klassen Double und Float für Fließkommazahlen
  gp 8.3 Die Utility-Klasse System und Properties
    gp 8.3.1 Systemeigenschaften der Java-Umgebung
    gp 8.3.2 line.separator
    gp 8.3.3 Browser-Version abfragen
    gp 8.3.4 Property von der Konsole aus setzen
    gp 8.3.5 Umgebungsvariablen des Betriebssystems
    gp 8.3.6 Einfache Zeitmessung und Profiling
  gp 8.4 Benutzereinstellungen
    gp 8.4.1 Eine zentrale Registry
    gp 8.4.2 Einträge einfügen, auslesen und löschen
    gp 8.4.3 Auslesen der Daten und Schreiben in anderem Format
    gp 8.4.4 Auf Ereignisse horchen
  gp 8.5 Klassenlader (Class Loader)
    gp 8.5.1 Woher die kleinen Klassen kommen
    gp 8.5.2 Setzen des Klassenpfades
    gp 8.5.3 Die wichtigsten drei Typen von Klassenladern
    gp 8.5.4 Der java.lang.ClassLoader
    gp 8.5.5 Hot Deployment mit dem URL-ClassLoader
    gp 8.5.6 Das jre/lib/endorsed-Verzeichnis
    gp 8.5.7 getContextClassLoader() vom Thread
    gp 8.5.8 Wie heißt die Klasse mit der Methode main()?
  gp 8.6 Design-Pattern und das Beobachten von Änderungen
    gp 8.6.1 Design-Pattern
    gp 8.6.2 Das Beobachter-Pattern (Observer/Observable)
  gp 8.7 Ausführen externer Programme, Compiler und Skripten
    gp 8.7.1 ProcessBuilder und Prozesskontrolle mit Process
    gp 8.7.2 Die Windows-Registry verwenden
    gp 8.7.3 Einen Browser/E-Mail-Client/Editor aufrufen
    gp 8.7.4 Ausführen von Skripten
    gp 8.7.5 Programme mit der Compiler API übersetzen
  gp 8.8 Annotationen
    gp 8.8.1 Annotationstypen @Override, @Deprecated, @SuppressWarnings
    gp 8.8.2 Common Annotations
    gp 8.8.3 Annotationen für Web-Services
    gp 8.8.4 Annotationen für XML-Mapping
  gp 8.9 Zum Weiterlesen


Galileo Computing

8.4 Benutzereinstellungen  downtop

Einstellungen des Benutzers – wie die letzten vier geöffneten Dateien oder das letzte benutzte Verzeichnis – müssen abgespeichert werden. Dazu gibt es eine Reihe von Möglichkeiten:

  • Die Einstellungen werden auf der Kommandozeile übergeben. Das lässt die Option -D auf der Kommandozeile zu, wenn das Dientsprogramm java die JVM startet.
  • In der Regel werden die Daten auf dem Rechner in einer Datei (Property-Datei) gespeichert. Die dafür nötigen Operationen vermittelt das Kapitel 12 Ein-/Ausgabeoperationen. Ein definiertes Ausgabeformat kann auch XML sein. Wie sich Dateien in XML speichern lassen, beschreibt Kapitel 13.
  • Die Daten können in einem globalen Verzeichnisbaum als nicht-lokal gespeichert werden. Dazu dienen Systeme wie JNDI, die etwa in einem LDAP-Baum die Benutzereintragungen verwalten.
  • Die Daten stehen in einer Datenbank.
  • Unter Windows gibt es eine andere Möglichkeit der Speicherung: die Registry.

Galileo Computing

8.4.1 Eine zentrale Registry  downtop

Läuft Java unter Windows, so lässt sich mit der Klasse java.util.prefs.Preferences ein Teilbaum (SOFTWARE/JavaSoft/Prefs unter HKEY_LOCAL_MACHINE beziehungsweise HKEY_CURRENT_USER) der Registry ansprechen. Da Unix-Systeme keine Registry besitzen, werden in diesem Fall die Informationen in einer XML-Datei gespeichert. [Die Systemeigenschaften landen unter /etc/.java/.systemPrefs und die Benutzereigenschaften lokal unter $HOME/.java/.userPrefs. ] Doch auch wenn unter Windows gespeichert wird, lässt sich auch nicht auf die gesamte Registry zugreifen – Java-Programme bekommen nur einen bestimmen Zweig zugesprochen.

Für die Benutzereinstellungen stehen zwei Gruppen zur Verfügung: Benutzerumgebung und Systemumgebung. Preferences-Objekte lassen sich über statische Funktionen auf zwei Arten erlangen:

  • Die erste Möglichkeit nutzt einen absoluten Pfad zum Registry-Knoten. Die Funktionen sind am Preferences-Objekt befestigt und heißen für die Benutzerumgebung userRoot() und für die Systemumgebung systemRoot().
  • Die zweite Möglichkeit nutzt die Eigenschaft, dass automatisch jede Klasse in eine Paketstruktur eingebunden ist. userNodeForPackage(Class) oder systemNodeForPackage-(Class) liefert ein Preferences-Objekt für eine Verzeichnisstruktur, in der die Klasse selbst liegt.

Beispiel Erfrage ein Benutzer-Preferences-Objekt über einen absoluten Pfad und über die Paketstruktur der eigenen Klasse.
Preferences userPrefs = Preferences.userRoot().node( "/com/javatutor/insel" ); 
Preferences userPrefs = Preferences.userNodeForPackage( this.getClass() );

Eine Unterteilung in eine Paketstruktur ist anzuraten, da andernfalls Java-Programme gegenseitig die Einstellung überschreiben könnten; die Registry-Informationen sind für alle sichtbar. Die Einteilung in das Paket der eigenen Klasse ist eine der Möglichkeiten.



Galileo Computing

8.4.2 Einträge einfügen, auslesen und löschen  downtop

Die Klasse Preferences hat große Ähnlichkeit mit den Klassen Properties beziehungsweise HashMap (vergleiche Kapitel 11). Schlüssel-/Wertepaare lassen sich einfügen, löschen und erfragen. Allerdings ist die Klasse Preferences kein Mitglied der Collection-API, und es existiert auch keine Implementierung von Collection-Schnittstellen.


abstract class java.util.prefs.Preferences

  • abstract void put( String key, String value )
  • abstract void putBoolean( String key, boolean value )
  • abstract void putByteArray( String key, byte[] value )
  • abstract void putDouble( String key, double value )
  • abstract void putFloat( String key, float value )
  • abstract void putInt( String key, int value )
  • abstract void putLong( String key, long value ) Bildet eine Assoziation zwischen den Schlüsselnamen und dem Wert. Die Varianten mit den speziellen Datentypen nehmen intern eine einfache String-Umwandlung vor und sind nur kleine Hilfsfunktionen; so steht in putDouble() nur put(key, Double.toString-(value)). putByteArray() konvertiert die Daten nach der Base64-Kodierung und legt sie intern als String ab.
  • abstract String get( String key, String def )
  • abstract boolean getBoolean( String key, boolean def )
  • abstract byte[] getByteArray( String key, byte def[] )
  • abstract double getDouble( String key, double def )
  • abstract float getFloat( String key, float def )
  • abstract int getInt( String key, int def )
  • abstract long getLong( String key, long def ) Liefert den gespeicherten Wert typgerecht aus. Fehlerhafte Konvertierungen werden etwa mit einer NumberFormatException bestraft. Der zweite Parameter erlaubt die Angabe eines Alternativwerts, falls es keinen assoziierten Wert zu dem Schlüssel gibt.
  • abstract String[] keys() Liefert alle Knoten unter der Wurzel, denen ein Wert zugewiesen wurde. Falls der Knoten keine Eigenschaften hat, liefert keys() ein leeres Feld.
  • abstract void flush() Die Änderungen werden unverzüglich in den persistenten Speicher geschrieben.

Unser folgendes Programm richtet einen neuen Knoten unter /com/javatutor/insel ein. Aus den über System.getProperties() ausgelesenen System-Eigenschaften sollen alle Eigenschaften, die mit »user.« beginnen, in die Registry übernommen werden.

Listing 8.7    com/javatutor/insel/prefs/PropertiesInRegistry.java

package com.javatutor.insel.prefs; 
 
import java.io.ByteArrayOutputStream; 
import java.util.Enumeration; 
import java.util.prefs.*; 
 
public class PropertiesInRegistry 
{ 
  static Preferences prefs = Preferences.userRoot().node( "/com/javatutor/insel" ); 
 
  static void fillRegistry() 
  { 
    for ( Object o : System.getProperties().keySet() ) 
    { 
      String key = o.toString(); 
 
      if ( key.startsWith("user.") && System.getProperty(key).length() != 0 ) 
        prefs.put( key, System.getProperty(key) ); 
    } 
  }

Um die Elemente auszulesen, kann ein bestimmtes Element mit getXXX() erfragt werden. Die Ausgabe aller Elemente unter einem Knoten gelingt am besten mit keys(). Das Auslesen kann eine BackingStoreException auslösen, falls der Zugriff auf den Knoten nicht möglich ist. Mit get() erfragen wir anschließend den mit dem Schlüssel assoziierten Wert. Wir geben »---« aus, falls der Schlüssel keinen assoziierten Wert besitzt.

  static void display() 
  { 
    try 
    { 
      for ( String key : prefs.keys() ) 
        System.out.println( key + ": " + prefs.get(key, "---") ); 
    } 
    catch ( BackingStoreException e ) 
    { 
      System.err.println( "Knoten können nicht ausgelesen werden: " + e ); 
    } 
  }

Hinweis Die Größen der Schlüssel und Werte sind beschränkt! Der Knoten- und Schlüsselname darf maximal Preferences.MAX_NAME_LENGTH/MAX_KEY_LENGTH Zeichen umfassen, und die Werte dürfen nicht größer als MAX_VALUE_LENGTH sein. Die aktuelle Belegung der Konstanten gibt 80 Zeichen und 8 KB an.

Um Einträge wieder loszuwerden, gibt es drei Methoden: clear(), remove() und removeNode(). Die Namen sprechen für sich.


Galileo Computing

8.4.3 Auslesen der Daten und Schreiben in anderem Format  downtop

Die Daten aus den Preferences lassen sich mit exportNode(OutputStream) beziehungsweise exportSubtree(OutputStream) im UTF-8-kodierten XML-Format in einen Ausgabestrom schreiben. exportNode(OutputStream) speichert nur einen Knoten und exportSubtree(OutputStream) den Knoten inklusive seiner Kinder. Und auch der umgekehrte Weg funktioniert: importPreferences(InputStream) importiert Teile in die Registrierung. Die Schreib- und Lesefunktionen lösten eine IOException bei Fehlern aus, und eine InvalidPreferencesFormatException ist beim Lesen möglich, wenn die XML-Daten ein falsches Format haben.


Galileo Computing

8.4.4 Auf Ereignisse horchen  toptop

Änderungen lassen sich mit so genannten Listenern verfolgen. (Listener sind ein Konzept, das näher bei den grafischen Oberflächen genannt wird.) Der NodeChangeListener reagiert auf Einfüge- und Löschoperationen von Knoten, und der PreferenceChangeListener informiert bei Wertänderungen. Es ist nicht gesagt, dass Änderungen von anderen Applikationen auf den Knoten bemerkt werden.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.





 <<   zurück



Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de